#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#define high 18
#define width 32
//全局变量命名
int canvas[high+1][width+1]={{0}}; //定义画布，为0时输出空格，为-1时输出砖块#，
                        //>1时输出挡板******，为1时输出小球O
int ball_vx,ball_vy;        //小球的速度
int pause;                //暂停功能
int score;            //分数,小球速度

void gotoxy(int x,int y)
{
    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD pos;
    pos.X=x;
    pos.Y=y;
    SetConsoleCursorPosition(handle,pos);
}

void HideCursor()          //隐藏光标
{
    CONSOLE_CURSOR_INFO cursor_info={1,0};//第二个值为0表示隐藏光标
    SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);
}

void start()              //数据初始化
{
    canvas[3][0]=1;//初始化小球位置
    ball_vx=1;      //初始化小球速度
    ball_vy=1;

    int i,j;            //初始化砖块位置
    for(i=0;i<3;i++){
        for(j=0;j<width;j++){
            canvas[i][j]=-1;
        }
    }

    for(i=width/4;i<8+width/4;i++)  //初始化杆的位置
    {
        canvas[high-1][i]=i+2-width/4;
        //printf("haha");为什么没有输出？？？******
    }

    pause=0;        //暂停
    score=0;        //杆接中分数

    HideCursor();    //隐藏光标
}

void show()         //显示画面
{
    int i,j;

    gotoxy(0,0);//光标移动到原点位置，以下重画清屏

    for(i=0;i<=high;i++)
    {
        for(j=0;j<=width;j++)
        {
            if(canvas[i][j]==1)//输出小球
                printf("O");
            else if(canvas[i][j]==-1)
                printf("#");      //输出砖块
            else if(canvas[i][j]>1) //输出杆
                printf("*");
            else if(j==width)     //输出右边界
                printf("|");
            else if(i==high)
                printf("-");      //输出下边界
            else
                printf(" ");            //输出空格
        }
        printf("\n");
    }
    printf("得分：%d\n",score);
    Sleep(100);
}


void update_without_input() //与用户输入无关的
{
    int i,j;
    int old_x_Ball,old_y_Ball;
    for(i=3;i<high;i++)
    {
        for(j=0;j<width;j++)
        {
            if(canvas[i][j]==1)
            {
                canvas[i][j]=0;         //旧位置清空
                old_x_Ball=i;           //记录旧位置
                old_y_Ball=j;
            }
        }
    }//以下为小球新位置的情况
    //若碰到左右边界
    if(old_y_Ball+ball_vy==0 || old_y_Ball+ball_vy==width)
    {
        ball_vy=-ball_vy;
    }
    //若碰到杆，反弹
    if(canvas[old_x_Ball+ball_vx][old_y_Ball+ball_vy]>1)
    {
        ball_vx=-ball_vx;
    }
    //若碰到砖块，消灭一个并反弹
    if(canvas[old_x_Ball+ball_vx][old_y_Ball+ball_vy]==-1)
    {
        canvas[old_x_Ball+ball_vx][old_y_Ball+ball_vy]=0;
        ball_vx=-ball_vx;
        score++;
        printf("\a");//响铃
    }
    //如果碰到砖块球反弹
    if(canvas[old_x_Ball+ball_vx][old_y_Ball+ball_vy]==-1)
    {
        ball_vx=-ball_vx;
    }
    //若碰到下边界，结束游戏
    //printf("%d %d  ",canvas[old_x_Ball+ball_vx][old_y_Ball+ball_vy],old_x_Ball+ball_vx);
    if(canvas[old_x_Ball+ball_vx][old_y_Ball+ball_vy]==0 && old_x_Ball+ball_vx==high-1)
    {
        printf("Game Over!");
        exit(0);
    }
    else//若未结束，将新位置赋值为1
        canvas[old_x_Ball+ball_vx][old_y_Ball+ball_vy]=1;
}

void update_with_input()
{
    char input;
    int left,right,i;

    if(kbhit())//当用户按键时执行
    {
        input=getch();
                //执行暂停和继续功能
        if(input==27)
        {
            if(pause==0)
                pause=1;
            else
                pause=0;
        }
        //杆的移动
        if(input=='d'){
            for(i=0;i<width-1;i++)
            {
                if(canvas[high-1][i]==9)
                {
                    right=i;//找出右端第1个点
                }
            }
            if(right<width-1){
                canvas[high-1][right+1]=9;//新右端点
                for(i=right;i>right-7;i--)//左边7个点
                    canvas[high-1][i]--;
                canvas[high-1][right-7]=0;
            }
        }
        if(input=='a')
        {
            for(i=0;i<width-1;i++)
            {
                if(canvas[high-1][i]==2)
                    left=i;//记录左端点
            }
            if(left>0)
            {
                for(i=left;i<left+7;i++)
                {
                    canvas[high-1][i]++;
                }
                canvas[high-1][left+7]=0;
                canvas[high-1][left-1]=2;
            }
        }

    }
}

int main()
{
    start();
    while(1)
    {
        if(pause==0)//执行继续功能
        {
            show();
            update_without_input();
        }
         update_with_input();
    }
    return 0;
}